home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / PROGRAMM / ASSEMBLE / H145.ZIP / ASXXXX_3.ZIP / M00ADR.C < prev    next >
C/C++ Source or Header  |  1990-07-18  |  2KB  |  156 lines

  1. /* m00adr.c */
  2.  
  3. /*
  4.  * (C) Copyright 1989,1990
  5.  * All Rights Reserved
  6.  *
  7.  * Alan R. Baldwin
  8.  * 721 Berkeley St.
  9.  * Kent, Ohio  44240
  10.  */
  11.  
  12. #include <stdio.h>
  13. #include <setjmp.h>
  14. #include "asm.h"
  15. #include "m6800.h"
  16.  
  17. int
  18. addr(esp)
  19. register struct expr *esp;
  20. {
  21.     register c;
  22.  
  23.     if ((c = getnb()) == '#') {
  24.         expr(esp, 0);
  25.         esp->e_mode = S_IMMED;
  26.     } else if (c == ',') {
  27.         esp->e_mode = S_INDX;
  28.         esp->e_flag = 0;
  29.         esp->e_addr = 0;
  30.         esp->e_base.e_ap = NULL;
  31.         if (admode(abx) != S_X)
  32.             aerr();
  33.     } else if (c == '*') {
  34.         expr(esp, 0);
  35.         esp->e_mode = S_DIR;
  36.         if (esp->e_addr & ~0xFF)
  37.             err('d');
  38.         if (more()) {
  39.             comma();
  40.             esp->e_mode = S_INDX;
  41.             if (admode(abx) != S_X)
  42.                 aerr();
  43.         }
  44.     } else {
  45.         unget(c);
  46.         if ((esp->e_mode = admode(abx)) != 0) {
  47.             ;
  48.         } else {
  49.             expr(esp, 0);
  50.             if (more()) {
  51.                 comma();
  52.                 esp->e_mode = S_INDX;
  53.                 if (admode(abx) != S_X)
  54.                     aerr();
  55.                 if ((!esp->e_flag)
  56.                     && (esp->e_base.e_ap==NULL)
  57.                     && (esp->e_addr & ~0xFF))
  58.                     aerr();
  59.             } else {
  60.                 if ((!esp->e_flag)
  61.                     && (esp->e_base.e_ap==NULL)
  62.                     && !(esp->e_addr & ~0xFF)) {
  63.                     esp->e_mode = S_DIR;
  64.                 } else {
  65.                     esp->e_mode = S_EXT;
  66.                 }
  67.             }
  68.         }
  69.     }
  70.     return (esp->e_mode);
  71. }
  72.     
  73. /*
  74.  * Enter admode() to search a specific addressing mode table
  75.  * for a match. Return the addressing value on a match or
  76.  * zero for no match.
  77.  */
  78. int
  79. admode(sp)
  80. register struct adsym *sp;
  81. {
  82.     register char *ptr;
  83.     register int i;
  84.     unget(getnb());
  85.     i = 0;
  86.     while ( *(ptr = (char *) &sp[i]) ) {
  87.         if (srch(ptr)) {
  88.             return(sp[i].a_val);
  89.         }
  90.         i++;
  91.     }
  92.     return(0);
  93. }
  94.  
  95. /*
  96.  *      srch --- does string match ?
  97.  */
  98. int
  99. srch(str)
  100. register char *str;
  101. {
  102.     register char *ptr;
  103.     ptr = ip;
  104.  
  105. #if    CASE_SENSITIVE
  106.     while (*ptr && *str) {
  107.         if(*ptr != *str)
  108.             break;
  109.         ptr++;
  110.         str++;
  111.     }
  112.     if (*ptr == *str) {
  113.         ip = ptr;
  114.         return(1);
  115.     }
  116. #else
  117.     while (*ptr && *str) {
  118.         if(ccase[*ptr] != ccase[*str])
  119.             break;
  120.         ptr++;
  121.         str++;
  122.     }
  123.     if (ccase[*ptr] == ccase[*str]) {
  124.         ip = ptr;
  125.         return(1);
  126.     }
  127. #endif
  128.  
  129.     if (!*str)
  130.         if (any(*ptr," \t\n,];")) {
  131.             ip = ptr;
  132.             return(1);
  133.         }
  134.     return(0);
  135. }
  136.  
  137. /*
  138.  *      any --- does str contain c?
  139.  */
  140. int
  141. any(c,str)
  142. char    c, *str;
  143. {
  144.     while (*str)
  145.         if(*str++ == c)
  146.             return(1);
  147.     return(0);
  148. }
  149.  
  150. struct adsym    abx[] = {    /* a, b, or x registers */
  151.     "a",    S_A,
  152.     "b",    S_B,
  153.     "x",    S_X,
  154.     "",    0x00
  155. };
  156.